package com.zenithmind.exam.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.exam.pojo.dto.QuestionCreateDTO;
import com.zenithmind.exam.pojo.entity.Question;
import com.zenithmind.exam.pojo.vo.QuestionVO;

import java.util.List;

/**
 * 题目服务接口
 * 
 * @author ZenithMind
 * @since 2024-07-01
 */
public interface QuestionService extends IService<Question> {

    /**
     * 创建题目
     * 
     * @param questionCreateDTO 题目创建DTO
     * @return 创建结果
     */
    boolean createQuestion(QuestionCreateDTO questionCreateDTO);

    /**
     * 更新题目
     * 
     * @param questionId 题目ID
     * @param questionCreateDTO 题目更新DTO
     * @return 更新结果
     */
    boolean updateQuestion(String questionId, QuestionCreateDTO questionCreateDTO);

    /**
     * 删除题目
     * 
     * @param questionId 题目ID
     * @return 删除结果
     */
    boolean deleteQuestion(String questionId);

    /**
     * 根据ID获取题目
     * 
     * @param questionId 题目ID
     * @param showAnswer 是否显示答案
     * @return 题目信息
     */
    QuestionVO getQuestionById(String questionId, boolean showAnswer);

    /**
     * 根据题库ID获取题目列表
     * 
     * @param bankId 题库ID
     * @return 题目列表
     */
    List<QuestionVO> getQuestionsByBankId(String bankId);

    /**
     * 分页查询题目列表
     * 
     * @param page 分页参数
     * @param bankId 题库ID
     * @param title 题目标题
     * @param type 题目类型
     * @param difficulty 难度等级
     * @param status 状态
     * @return 分页结果
     */
    IPage<QuestionVO> getQuestionPage(Page<Question> page, String bankId, String title, 
                                     Integer type, Integer difficulty, Integer status);

    /**
     * 随机获取题目列表
     * 
     * @param bankId 题库ID
     * @param type 题目类型
     * @param difficulty 难度等级
     * @param count 数量
     * @return 题目列表
     */
    List<QuestionVO> getRandomQuestions(String bankId, Integer type, Integer difficulty, Integer count);

    /**
     * 搜索题目
     * 
     * @param keyword 关键词
     * @return 题目列表
     */
    List<QuestionVO> searchQuestions(String keyword);

    /**
     * 根据标签获取题目列表
     * 
     * @param tag 标签
     * @return 题目列表
     */
    List<QuestionVO> getQuestionsByTag(String tag);

    /**
     * 更新题目状态
     * 
     * @param questionId 题目ID
     * @param status 状态
     * @return 更新结果
     */
    boolean updateQuestionStatus(String questionId, Integer status);

    /**
     * 批量删除题目
     * 
     * @param questionIds 题目ID列表
     * @return 删除结果
     */
    boolean batchDeleteQuestions(List<String> questionIds);

    /**
     * 复制题目到其他题库
     * 
     * @param questionId 题目ID
     * @param targetBankId 目标题库ID
     * @return 复制结果
     */
    boolean copyQuestionToBank(String questionId, String targetBankId);

    /**
     * 移动题目到其他题库
     * 
     * @param questionId 题目ID
     * @param targetBankId 目标题库ID
     * @return 移动结果
     */
    boolean moveQuestionToBank(String questionId, String targetBankId);

    /**
     * 更新题目使用统计
     * 
     * @param questionId 题目ID
     * @param isCorrect 是否正确
     */
    void updateQuestionStatistics(String questionId, boolean isCorrect);

    /**
     * 获取高频错题
     * 
     * @param limit 限制数量
     * @return 高频错题列表
     */
    List<QuestionVO> getFrequentWrongQuestions(Integer limit);

    /**
     * 导入题目
     * 
     * @param bankId 题库ID
     * @param questions 题目列表
     * @return 导入结果
     */
    boolean importQuestions(String bankId, List<QuestionCreateDTO> questions);

    /**
     * 导出题目
     * 
     * @param bankId 题库ID
     * @return 题目列表
     */
    List<QuestionVO> exportQuestions(String bankId);
}
